Client-side load balancing হলো এমন একটি পদ্ধতি, যেখানে ক্লায়েন্ট অ্যাপ্লিকেশন সার্ভিস ইন্সট্যান্সগুলোর তালিকা পায় এবং নিজে থেকেই সার্ভিস ইন্সট্যান্স নির্বাচন করে। Spring Boot-এ Spring Cloud LoadBalancer
এবং Ribbon
(ডিপ্রিকেটেড) ব্যবহার করে ক্লায়েন্ট-সাইড লোড ব্যালেন্সিং সেটআপ করা যায়।
Spring Cloud LoadBalancer হলো একটি ক্লায়েন্ট-সাইড লোড ব্যালেন্সার, যা API কল করার সময় বিভিন্ন সার্ভিস ইন্সট্যান্সের মধ্যে লোড ভাগাভাগি করে।
Spring Cloud LoadBalancer
ব্যবহার করতে, আপনার pom.xml
বা build.gradle
-এ নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
application.yml
কনফিগার করাসার্ভিস ইন্সট্যান্সগুলোর তালিকা কনফিগার করুন। উদাহরণস্বরূপ, যদি আপনার order-service
নামে একটি সার্ভিস থাকে:
spring:
cloud:
discovery:
client:
simple:
instances:
order-service:
- uri: http://localhost:8081
- uri: http://localhost:8082
- uri: http://localhost:8083
Spring Cloud LoadBalancer ব্যবহার করতে WebClient-এ সরাসরি ইন্টিগ্রেশন করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
Spring Cloud LoadBalancer-কে @LoadBalanced
দিয়ে নির্দেশ করতে হয় যে এটি লোড ব্যালেন্সিং করতে হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class OrderServiceClient {
private final WebClient.Builder webClientBuilder;
@Autowired
public OrderServiceClient(WebClient.Builder webClientBuilder) {
this.webClientBuilder = webClientBuilder;
}
public String fetchOrderDetails() {
return webClientBuilder.build()
.get()
.uri("http://order-service/orders") // সার্ভিস নাম ব্যবহার করুন
.retrieve()
.bodyToMono(String.class)
.block();
}
}
Ribbon ব্যবহার করতে, নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
application.yml
কনফিগার করাRibbon সার্ভিস ইন্সট্যান্সের তালিকা থেকে সার্ভিস লোড ব্যালেন্স করবে:
order-service:
ribbon:
listOfServers: localhost:8081,localhost:8082,localhost:8083
Ribbon-এ লোড ব্যালেন্সিং করতে @LoadBalanced
অ্যানোটেশন ব্যবহার করুন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderServiceClient {
private final RestTemplate restTemplate;
@Autowired
public OrderServiceClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String fetchOrderDetails() {
return restTemplate.getForObject("http://order-service/orders", String.class);
}
}
Spring Cloud LoadBalancer-এ আপনি কাস্টম লোড ব্যালেন্সিং স্ট্র্যাটেজি ব্যবহার করতে পারেন।
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LoadBalancerConfig {
@Bean
public ReactorServiceInstanceLoadBalancer customLoadBalancer(ServiceInstanceListSupplier supplier) {
return new RandomLoadBalancer(supplier, "order-service"); // Random Load Balancing
}
}
Spring Cloud LoadBalancer ইন্টিগ্রেশন Eureka
বা অন্য Discovery সার্ভিসের সাথেও করা যায়।
pom.xml
-এ ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
উপরোক্ত কৌশলগুলো ব্যবহার করে আপনি একটি রিলায়েবল ক্লায়েন্ট-সাইড লোড ব্যালান্সিং মেকানিজম ইমপ্লিমেন্ট করতে পারবেন।